主要技巧
1. 建立一个内部类Node
2. 取值时.在二叉树循环体外设立一个变数temp,依照特定的键(key)遍历二叉树,当遍历到的节点的key是与寻找的
key相等时,将节点的值赋予temp, 而用作遍历的方法不要有返回值
private void getValue(String key){
//依照key取值value
if(this.leftNode!=null){this.leftNode.getValue(key);}
if(this.key==key){temp=this.value;}
if(this.rightNode!=null){this.rightNode.getValue(key);}
}
以下是原始数据和想要实现的统计结果
java代码 (总共有2个类,Btree和TestBtree)
1 .Class Btree (内部类Node) 用于设定各种方法
package btree;
public class Btree{
Node root;
static Double temp=null; //建立一个double变量,用来储存内部类方法计算的(double)结果(平均值,最大值等)
int count=0; //建立一个int变量,用来储存内部类方法计算的(int)结果(节点数)
boolean flag=false; //用于测试是否存在
public void append(String key, Double value){ //新增
Node node=new Node(key,value);
if (root==null){
root=node;
}else{
root.append(key,value);
}
}
public void del(String key){ //删除
this.update(key, null);
}
public void keyExist(String key){ //检查key是否存在
flag=false;
root.keyExist(key);
if(flag==false){
System.out.println(key+"不存在");
}else{
System.out.println(key+"存在");
}
}
public void isValid(String key){ //检查是否为有效数据
flag=false;
root.isValid(key);
if(flag==false){
System.out.println(key+"不存在或值为空");
}else{
System.out.println(key+"是有效数据");
}
}
public void update(String key, Double value){ //更新数据
count=0;
root.update(key,value);
if(count>0){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
}
public void printAll(){ //打印全部节点,包括值为null的
count=0;
if(root==null){
System.out.println("Btree内无资料");
}else{
System.out.println("No"+"\t"+"key"+"\t"+"value");
this.root.printAll();
}
}
public void getValue(String key){ //依照key查询value
temp=null;
flag=false;
root.isValid(key); //先检查是否存在
if(flag==true){
root.getValue(key);
System.out.println("key= "+key+" , "+"value= "+temp);
}else{System.out.println(key+"不存在或为空值");}
}
public int getNum(){ //查询节点数
count=0;
root.getNum();
System.out.print("有效节点数为 ");
System.out.println(count);
return count;
}
public Double getSum(){ //查询总和
temp=0.0;
root.getSum();
System.out.print("value的合计值为 ");
Double b=(double)((int)(temp*100))/100;
System.out.println(b);
return b;
}
public Double getAvg(){ //查询平均值
temp=0.0;
count=0;
root.getSum();
root.getNum();
Double result=(double)((int)((temp/count)*100))/100;
System.out.print("value的平均值为 ");
System.out.println(result);
return result;
}
public Double getMax(){ //查询最大值
temp=null;
root.getMax();
Double result=(double)((int)(temp*100))/100;
System.out.print("value的最大值为 ");
System.out.println(result);
return result;
}
public Double getMin(){ //查询最小值
temp=null;
root.getMin();
Double result=(double)((int)(temp*100))/100;
System.out.print("value的最小值为 ");
System.out.println(result);
return result;
}
public void getSummary(){ //打印综合报表
count=0;
root.getNum();
int num=count;
temp=0.0;
root.getSum();
Double sum=(double)(int)(temp*100)/100;
temp=0.0;
count=0;
root.getSum();
root.getNum();
double avg=(double)((int)((temp/count)*100))/100;
temp=null;
root.getMax();
Double max=temp;
temp=null;
root.getMin();
Double min=temp;
System.out.println("节点数"+"\t"+"合计"+"\t"+"平均"+"\t"+"最大值"+"\t"+"最小值");
System.out.println(num+"\t"+sum+"\t"+avg+"\t"+max+"\t"+min);
}
//以下是内部类Node
private class Node{
String key;
Double value;
Node leftNode;
Node rightNode;
private Node(String key, double value) {
this.key = key;
this.value = value;
}
private Node(String key) {
super();
this.key = key;
}
private void printAll(){ //打印全部
if(this.leftNode!=null){this.leftNode.printAll();}
System.out.println((count+1)+"\t"+this.key+"\t"+this.value);count++;
if(this.rightNode!=null){this.rightNode.printAll();}
}
private void getSum(){ //查询总和
if(this.leftNode!=null){this.leftNode.getSum();}
if(this.value!=null)temp+=this.value;
if(this.rightNode!=null){this.rightNode.getSum();}
}
private void getNum(){ //查询有效节点数
if(this.leftNode!=null){this.leftNode.getNum();}
if(this.value!=null)count++;
if(this.rightNode!=null){this.rightNode.getNum();}
}
private void getMax(){ //查询最大值
if(this.leftNode!=null){this.leftNode.getMax();}
if(temp==null && this.value!=null){temp=this.value;
}else{
if(this.value!=null&&temp!=null && this.value>temp){temp=this.value;}
}
if(this.rightNode!=null){this.rightNode.getMax();}
}
private void getMin(){ //查询最小值
if(this.leftNode!=null){this.leftNode.getMin();}
if(temp==null && this.value!=null){temp=this.value;
}else{
if(this.value!=null&&temp!=null && this.value<temp){temp=this.value;}
}
if(this.rightNode!=null){this.rightNode.getMin();}
}
private void append(String key,Double value){ //新增节点
Node node=new Node(key,value);
if(key.compareTo(this.key)<0){
if(leftNode==null){
leftNode=node;
}else{
leftNode.append(key, value);
}
}
if(key.compareTo(this.key)>0){
if(rightNode==null){
rightNode=node;
}else{
rightNode.append(key, value);
}
}
}
private void getValue(String key){ //依照key取值value
if(this.leftNode!=null){
this.leftNode.getValue(key);
}
if(this.key==key){
temp=this.value;
}
if(this.rightNode!=null){
this.rightNode.getValue(key);
}
}
private void update(String key,Double value){ //更新节点的Value值
if(this.leftNode!=null){this.leftNode.update(key,value);}
if(this.key==key){this.value=value;count++;}
if(this.rightNode!=null){this.rightNode.update(key,value);}
}
private void keyExist(String key){ //查询key是否存在
if(this.leftNode!=null){this.leftNode.keyExist(key);}
if(this.key==key){flag=true;}
if(this.rightNode!=null){this.rightNode.keyExist(key);}
}
private void isValid(String key){ //查询是否是有效数据
if(this.leftNode!=null){this.leftNode.isValid(key);}
if(this.key==key && this.value!=null){flag=true;}
if(this.rightNode!=null){this.rightNode.isValid(key);}
}
}//end of Class Node
} //end of Class Btree
2. Class TestBtree ,用于测试
package btree;
public class TestBtree {
public static void main(String[] args){
System.out.println("******创建Btree*********");
Btree btree=new Btree(); //创建Btree
btree.printAll(); //显示btree状态
System.out.println();
System.out.println("******开始添加11笔数据******");
btree.append("200",203.88); //添加数据
btree.append("300",300.33);
btree.append("400",400.44);
btree.append("500",500.55);
btree.append("600",600.66);
btree.append("中国",700.77);
btree.append("700",-883.91);
btree.append("@@",-102.65);
btree.append("Hello Btree",-101.55);
btree.append("abc",-303.53);
btree.append("coffee",99.99);
System.out.println("添加成功");
System.out.println();
btree.getSummary();
System.out.println();
btree.printAll();
System.out.println();
System.out.println("******测试删除数据的功能,删除coffee******");
btree.del("coffee");
System.out.println();
System.out.println("coffe的值会更新为空值null,保留coffee的Key,有效数据降为10笔**");
System.out.println();
btree.getSummary();
System.out.println();
System.out.println("******测试打印全部Key及Value功能******");
btree.printAll();
System.out.println();
System.out.println("******测试查询Key是否存在的功能******");
btree.keyExist("cake");
btree.keyExist("abc");
btree.keyExist("coffee");
System.out.println();
System.out.println("******测试数据是否有效的功能******");
System.out.println("<<查询不存在的key>>");
btree.isValid("cake");
System.out.println();
System.out.println("<<查询空值的key>>");
btree.isValid("coffee");
System.out.println();
System.out.println("<<查询有效的key>>");
btree.isValid("abc");
System.out.println();
System.out.println("******测试查询功能******");
System.out.println("<<查询有效的>>");
btree.getValue("abc");
System.out.println();
System.out.println("<<查询不存在的key>>");
btree.getValue("cake");
System.out.println();
System.out.println("<<查询空值的key>>");
btree.getValue("coffee");
System.out.println();
System.out.println("******测试查询有效节点数功能******");
btree.getNum();
System.out.println();
System.out.println("******测试查询合计值功能******");
btree.getSum();
System.out.println();
System.out.println("******测试查询平均值功能******");
btree.getAvg();
System.out.println();
System.out.println("******测试查询最大值功能******");
btree.getMax();
System.out.println();
System.out.println("******测试查询最小值功能******");
btree.getMin();
System.out.println();
System.out.println("******测试打印汇总表功能******");
btree.getSummary();
System.out.println();
System.out.println("******测试更新功能******");
System.out.println("将300的值改为null,abc的值改为null,coffee的值改为-999.0,中国的值改为800.0");
btree.update("300",null);
btree.update("abc",null);
btree.update("coffee",-999.0);
btree.update("中国",800.0);
System.out.println();
btree.printAll();
System.out.println();
btree.getSummary();
System.out.println();
System.out.println("******测试结束******");
}
}
测试结果如下:
******创建Btree*********
Btree内无资料
******开始添加11笔数据******
添加成功
节点数 合计 平均 最大值 最小值
11 1414.98 128.63 700.77 -883.91
No key value
1 200 203.88
2 300 300.33
3 400 400.44
4 500 500.55
5 600 600.66
6 700 -883.91
7 @@ -102.65
8 Hello Btree -101.55
9 abc -303.53
10 coffee 99.99
11 中国 700.77
******测试删除数据的功能,删除coffee******
更新成功
coffe的值会更新为空值null,保留coffee的Key,有效数据降为10笔**
节点数 合计 平均 最大值 最小值
10 1314.99 131.49 700.77 -883.91
******测试打印全部Key及Value功能******
No key value
1 200 203.88
2 300 300.33
3 400 400.44
4 500 500.55
5 600 600.66
6 700 -883.91
7 @@ -102.65
8 Hello Btree -101.55
9 abc -303.53
10 coffee null
11 中国 700.77
******测试查询Key是否存在的功能******
cake不存在
abc存在
coffee存在
******测试数据是否有效的功能******
<<查询不存在的key>>
cake不存在或值为空
<<查询空值的key>>
coffee不存在或值为空
<<查询有效的key>>
abc是有效数据
******测试查询功能******
<<查询有效的>>
key= abc , value= -303.53
<<查询不存在的key>>
cake不存在或为空值
<<查询空值的key>>
coffee不存在或为空值
******测试查询有效节点数功能******
有效节点数为 10
******测试查询合计值功能******
value的合计值为 1314.99
******测试查询平均值功能******
value的平均值为 131.49
******测试查询最大值功能******
value的最大值为 700.77
******测试查询最小值功能******
value的最小值为 -883.91
******测试打印汇总表功能******
节点数 合计 平均 最大值 最小值
10 1314.99 131.49 700.77 -883.91
******测试更新功能******
将300的值改为null,abc的值改为null,coffee的值改为-999.0,中国的值改为800.0
更新成功
更新成功
更新成功
更新成功
No key value
1 200 203.88
2 300 null
3 400 400.44
4 500 500.55
5 600 600.66
6 700 -883.91
7 @@ -102.65
8 Hello Btree -101.55
9 abc null
10 coffee -999.0
11 中国 800.0
节点数 合计 平均 最大值 最小值
9 418.41 46.49 800.0 -999.0
******测试结束******